﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Arrays
{
    class Program
    {
        static void Main(string[] args)
        {
            int i;
            do
            {
                Console.WriteLine("Меню:");
                Console.WriteLine("1) Найти max элемент массива. Вывести на экран элементы массива и max.");
                Console.WriteLine("2) Определить кол-во элементов в заданном массиве, отличающихся от min на 5.");
                Console.WriteLine("3) Заменить 5-й элемент каждой строки sum 4-х предыдущих элементов этой строки");
                Console.WriteLine("4) Найти сумму элементов, расположенных до max элемента массива.");
                Console.WriteLine("5) Выберите задание 5");
                Console.WriteLine("6) Выйти из программы");
                Console.WriteLine("7) Выберите задание 7");
                Console.WriteLine("8) Выйти из программы");
                //Console.WriteLine("9) Выйти из программы");
                Console.WriteLine("Ваше решение");
                i = Convert.ToInt32(Console.ReadLine());
                switch (i)
                {
                    case 1:
                        MaxFromArray();
                        break;
                    case 2:
                        MaxFive();
                        break;
                    case 3:
                        FirstTask();
                        break;
                    case 4:
                        SumOfElemetnsBeforeMax();
                        break;
                    case 5:
                        EvenAndOddElements();
                        break;
                    case 6:
                        Console.WriteLine("Программа будет закрыта");
                        break;
                    default:
                        Console.WriteLine("Неверный ввод");
                        break;
                }
                Console.Write("\n\nНажмите любую клавишу");
                Console.ReadKey();
                Console.Clear();
            }
            while (i != 6);

        }

        //__________________________________________________ Метод ввода 1-мерного массива с консоли
        static int[] FillArrayFromConsole(int arraySize)
        {
            int[] array = new int[arraySize];
            for (int i = 0; i < arraySize; i++)
            {
                Console.Write("[{0}]: ", i);
                array[i] = Int32.Parse(Console.ReadLine());
            }
            return array;
        }

        //__________________________________________________ Метод вывода 1-мерного массива
        static void PrintDimensionalArray(int[] arrayForPrint)
        {
            for (int i = 0; i < arrayForPrint.GetLength(0); i++)
            {
                Console.WriteLine("{0} \t", arrayForPrint[i]);
            }
            Console.WriteLine();
        }

        //__________________________________________________ Метод вывода 2-мерного массива
        static void PrintTwoDimensionalArray(int[,] arrayForPrint)
        {
            for (int i = 0; i < arrayForPrint.GetLength(0); i++)
            {
                for (int j = 0; j < arrayForPrint.GetLength(1); j++)
                {
                    Console.Write("{0}\t", arrayForPrint[i, j]);
                }
                Console.WriteLine();
            }
        }
        
        //__________________________________________________ Метод рандомного заполнения 1-мерного массива
        static int[] RandomFillDimensionalArray(int rowCount, int rndMinValue, int rndMaxValue)
        {
            int[] newArray = new int[rowCount];
            Random rnd = new Random();
            for (int i = 0; i < rowCount; i++)
            {
                newArray[i] = rnd.Next(rndMinValue, rndMaxValue);
            }
            return newArray;
        }

        
        //__________________________________________________ Метод рандомного заполнения 2-мерного массива
        static void FillArrayWithRandomNumbers(int[,] array)
        {
            Random rnd = new Random();
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    array[i, j] = rnd.Next(1, 21);
                }
            }
        }



        static void FirstTask () //1.1) Создается 2-х мерный массив размером 4 на 5 элементов, заполненный случайными числами
            //1.2) Вывести массив на консоль
            //1.3) Заменить 5-й элемент каждой строки суммой 4-х предыдущих элементов этой строки
            //1.4) Вывести полцученный результат на экран
        {
            int[,] array = new int [4,5];
            FillArrayWithRandomNumbers(array);
            PrintTwoDimensionalArray(array);
            for (int i = 0; i < array.GetLength(0); i++)
            {
                int sum = 0;
                for (int j = 0; j < array.GetLength(1)-1; j++)
                {
                    sum += array[i, j];
                }
                array[i, array.GetLength(1) - 1] = sum;
               }
            Console.WriteLine();
            PrintTwoDimensionalArray(array);
        }

        static void MaxFromArray() //Пользователь вводит массив из 5 элементов.
                                   //1) Найти max элемент массива. Вывести на экран элементы массива и max.
        {
            int[] table = new int[5];
            table = FillArrayFromConsole(5);
            int maxNumber = table.Max();
            for (int i = 1; i != 5; i++)
            {
                if (table[i] > maxNumber)
                {
                    maxNumber = table[i];
                }
            }
            for (int i = 0; i < 5; i++)
            {
                Console.Write("{0} ",table [i]);
            }
            Console.WriteLine();
            Console.WriteLine("Максимальное число в массиве: {0}", maxNumber);
        }

        static void MaxFive() //Пользователь вводит массив из 5 элементов.
                              //Определить кол-во элементов в заданном массиве, отличающихся от min на 5. Размер массива пользователь вводит в консоли
        {
            int count = 0;
            Console.WriteLine("Введите размер одномерного массива:");
            int arrayDemension =Convert.ToInt32(Console.ReadLine());
            int[] array = new int[arrayDemension];
            array = FillArrayFromConsole(arrayDemension);
            int minNumber = array.Min();
            for (int i = 1; i != arrayDemension; i++)
            {
                if (array[i] < minNumber)
                {
                    minNumber = array[i];
                }
                if (minNumber + 5 == array[i])
                    count++;
            }
            Console.WriteLine();
            Console.WriteLine("Количество элеметов больше min на 5: {0}", count);
        }
        //3) Дан одномерный массив, размер массива задается пользователем из консоли. Найти сумму элементов, расположенных до максимального элемента массива.
        //Если максимальных элементов несколько - то найти сумму элементов до первого максимального элемента. Если максимальный элемент первый в массиве - то сумма равна 0

        static void SumOfElemetnsBeforeMax ()
        {
            Console.WriteLine("Введите размер массива:");
            int arrayDemension = Convert.ToInt32(Console.ReadLine());
            int [] array = FillArrayFromConsole(arrayDemension);
            int maxNumber = Int32.MinValue;
            int sum = 0;
            for (int i = 1; i < arrayDemension; i++)
            {
                if (array[i] > maxNumber)
                {
                    maxNumber = array[i];
                }
            }
            int maxPosition = Array.IndexOf(array, maxNumber);        
            for (int i = 0; i < maxPosition; i++)
            {
                sum += array[i];
            }
            Console.WriteLine("Значение максимального элемента массива: {0}, сумма элементов до него: {1}", maxNumber, sum);
        }


        //4) Определить значение и номер последнего отрицательного элемента массива размером 8. Если отрицательных элементов нет - вывести соответствующее сообщение.

        //5) В одномерном массиве все элементы, расположенные после максимального, заменить средним значением элементов массива.
        //Вывести обновленный массив на экран. Размер массива указывается пользователем
        
        //08-12-2016
        //Создать массив - размеры массива выбирает пользователь из консоли. Заполнить массив случайными числами в диапазоне от 1 до 20
        //Вывести полученный массив на экран. Посчитать количество четных и нечетных элементов в массиве
        static void EvenAndOddElements ()
        {
            int[,] array = new int[4, 5];
            FillArrayWithRandomNumbers(array);
            PrintTwoDimensionalArray(array);
            int evenCount = 0;
            int oddCount = 0;
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    if (array[i, j] % 2 == 0)
                        evenCount++;
                    else
                        oddCount++;
                }
            }
            Console.WriteLine("Odd count: {0}", oddCount);
            Console.WriteLine("Even count: {0}", evenCount);
        }

    }
}
